/**
 * 闭包函数就是能够读取其他函数内部变量的函数
 * 闭包可以理解为定义在一个函数内部的函数
 * 闭包主要是为了在函数的外部能够使用函数内部的标量
 * 比如下面这个案例中，如果直接在func外使用a和b的值是不可能的
 * 但是如果在func内部声明一个函数 closure，这个函数天然的可以使用a和b
 * 然后在func的内部把这个函数closure return出去，我们在函数的外部，使用
 * func的时候，就可以获取函数func内部的变量数据
 */

function func () {
  var a = 1
  var b = 2
  function closure () {
    return a + b
  }
  return closure()
}
console.log(func())

/**
 * 比如统计一个接口被调用的次数，默认数据是1，调用一次就加一
 * 但是如果声明的是一个全局变量，他会被所有的用户共享
 * 中间如果谁修改了数据，值就会发生变化，但是
 * 采用闭包的形式，生成的num是不受其他因素影响的
 * 它是私有的，数据一直不会改变，这个测试可以在浏览器的调试工具中去调用方法fun1
 */
function fun1 () {
  let num = 0
  function fun2 () {
    num++
    return num
  }
  return fun2
}
let one = fun1()
console.log(one());
